#include <stdio.h>
#include "node.h"
#include "test4.tab.h"

int exeNode(Node* p) {
	if (!p) return 0;
	switch(p->type) {
		case TYPE_CONTENT :
			return p->content;
		case TYPE_INDEX:
			return Var[p->index];
		case TYPE_OP:
			switch(p->op.name) {
				case WHILE:
					while (exeNode(p->op.node[0])) exeNode(p->op.node[1]);
					return 0;
				case IF:
					if (exeNode(p->op.node[0]))
						exeNode(p->op.node[1]);
					else if (p->op.num > 2)
						exeNode(p->op.node[2]);
					return 0;
				case PRINT:
					printf("%d\n", exeNode(p->op.node[0]));
					return 0;
				case ';':
					exeNode(p->op.node[0]);
					return exeNode(p->op.node[1]);
				case '=':
					return Var[p->op.node[0]->index] = exeNode(p->op.node[1]);
				case UMINUS: return (-1) * exeNode(p->op.node[0]);
				case '+':	return exeNode(p->op.node[0]) + exeNode(p->op.node[1]);
				case '-':	return exeNode(p->op.node[0]) - exeNode(p->op.node[1]);
				case '*':	return exeNode(p->op.node[0]) * exeNode(p->op.node[1]);
				case '/':	return exeNode(p->op.node[0]) / exeNode(p->op.node[1]);
				case '%':	return exeNode(p->op.node[0]) % exeNode(p->op.node[1]);
				case '<':	return exeNode(p->op.node[0]) < exeNode(p->op.node[1]);
				case '>':	return exeNode(p->op.node[0]) > exeNode(p->op.node[1]);
				case GE:	return exeNode(p->op.node[0]) >= exeNode(p->op.node[1]);
				case LE:	return exeNode(p->op.node[0]) <= exeNode(p->op.node[1]);
				case NE:	return exeNode(p->op.node[0]) != exeNode(p->op.node[1]);
				case EQ:	return exeNode(p->op.node[0]) == exeNode(p->op.node[1]);
				case AND:	return exeNode(p->op.node[0]) && exeNode(p->op.node[1]);
				case OR:	return exeNode(p->op.node[0]) || exeNode(p->op.node[1]);
			}
	}
	return 0;
}
